html
php
ajax
python
mysql
android
objective-c
visual-studio
silverlight
html5
json
oracle
delphi
apache
mvc
asp
api
jsp
postgresql
Short answer: you can't set values on blocks "inside" of CMS blocks using layout XML.
When loadLayout() is called in action controllers, the layout XML is processed, all blocks are instantiated, and the <action> nodes are executed. But the blocks are not yet rendered. When renderLayout() is called the blocks are rendered by calling their toHtml() method.
loadLayout()
<action>
renderLayout()
toHtml()
If the block happens to be a cms/block (or cms/page) instance containing a {{block ...}} instance, that block will be instantiated at this time.
cms/block
cms/page
{{block ...}}
At this moment during the request flow all layout XML <action> nodes already have been processed. In essence you are referencing a block instance in the layout XML that doesn't yet exist.
As a workaround, it might work for you to add the product list block to the homepage using layout XML, too. The downside is that you can't place it freely in other content of the CMS block.
<cms_index_index><!-- layout handle for the default homepage action --> <reference name="content"> <block type="catalog/product_list" name="product_list"> <action method="setTemplate"> <template>catalog/product/list.phtml</template> </action> <action method="setCategoryId"> <catId>51</catId> </action> <action method="setColumnCount"> <count>4</count> </action> </block> </reference> </cms_index_index>
Of course you are not limited to the product list block. If you need to place the list inside of other content, you could add cms blocks to the homepage using layout XML ad well.